package net.src.socket3;

import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;

/**
 * 服务端tcp通信
 */
public class ServerDemo3 {
    //使用静态变量存储线程池,创建一个线程池来限制线程数量
    private static ExecutorService pool = new ThreadPoolExecutor(3, 5 ,
            6, TimeUnit.SECONDS, new ArrayBlockingQueue<>(2) , Executors.defaultThreadFactory(),
            new ThreadPoolExecutor.AbortPolicy() );
    public static void main(String[] args) throws Exception {
        System.out.println("服务端启动!");
        //注册端口
        ServerSocket serverSocket = new ServerSocket(7777);


        //定义死循环不断接收用户的连接请求
        while (true) {
            //获取到一个链接请求就交给一个线程来处理,不要用主线程来处理,因为主线程要用来处理多线程调度
            Socket socket = serverSocket.accept();
            //上线逻辑,也就是用户的连接请求可以被感知
            //这里因为接收到socket就可以输出上线信息,但是线程池满了之后,并没有实际的建立连接,所以客户端的消息可能发不到服务器
            System.out.println(socket.getRemoteSocketAddress() + "上线了!");
            //将接收到的一个socket交给独立的线程去处理
            ServerReaderThead target = new ServerReaderThead(socket);
            pool.execute(target);
        }


    }
}
